package br.com.ac.fatureweb.integration.utilitary;

public final class Mod10 {

	private static final String DIGITO_0 = "0";

	/*
	 * mostra os valores (pesos) que serão multiplicados por cada dígito do
	 * código de barras. Estes pesos são colocados da direita para a esquerda do
	 * código de barras na formação 2 1 2 1 2 etc. Estes valores são
	 * multiplicados pelos dígitos correspondentes do código de barras (Linha
	 * A), em seguida faz-se uma somatória de todos os dígitos do resultado da
	 * multiplicação do peso por cada dígito do código de barras (Linha D mostra
	 * os valores que serão usados na somatória). (Neste exemplo, o total
	 * apurado foi 75).
	 */
	private final static int pesos[] = { 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
			1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
			1, 2, 1, 2, 1, 2, 1, 2 };

	private final static int pesosAux[] = { 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 };

	/**
	 * 
	 */
	private Mod10() {
		super();
	}

	/**
	 * Calcular Digito Verificador através do Módulo 10.
	 *
	 */
	public static String getDV(final String numero) {
		/*
		 * Para cálculo do digito verificador que consta na quarta posição do
		 * código de barras, deverá ser feita a seguinte montagem: 1.1Definir
		 * uma área auxiliar de 43 posições subdividida em 2 blocos. 1.2 O
		 * primeiro de três posições deverá conter, o identificador do produto,
		 * identificação do segmento e identificador do valor efetivo ou
		 * referência. Ex: 826 1.3O segundo bloco deverá conter as 40 posições
		 * restantes;
		 * 
		 * Montar o campo para impressão no Código de Barras, com as três
		 * primeiras posições, o DAC já calculado, e as 40 posições restantes.
		 * 3.2 A representação numérica do Código de Barras, deverá ser montada
		 * após o cálculo do dígito verificador. 3.3 Observe que a somatória é
		 * feita somando-se todos os algarismos que compõe cada um dos
		 * resultados obtidos na Linha C. Exemplo: na posição 1 do código de
		 * barras, o resultado obtido foi 16, porem para a somatória deve ser
		 * considerada a soma 1 + 6 = 7 e não o valor 16. 3.4 Divide-se o total
		 * apurado por 10, obtendo o resto 5. 3.5 75:5 = resto 5 3.6 Subtrai-se
		 * o resto de 10 (dez) para obter o DAC, que no caso é “5”.
		 */
		int soma = 0;

		String aux = "";

		char[] lstNumber = numero.toCharArray();

		if (numero.length() > 11) {

			for (int index = 0; index < lstNumber.length; index++) {

				Character codeBarNumber = lstNumber[index];

				int pesosI = pesos[index];

				int valueOf = Integer.parseInt(codeBarNumber.toString());

				int auxNumber = valueOf * pesosI;

				System.out.println("Number aux: " + auxNumber);

				char[] charArray = String.valueOf(auxNumber).toCharArray();

				for (int posicao = 0; posicao < charArray.length; posicao++) {

					Character numberTemp = charArray[posicao];

					soma = soma + Integer.parseInt(numberTemp.toString());
				}
			}
		} else {
			for (int i = 0; i < 11; i++) {
				aux = String.valueOf(Integer.parseInt(String.valueOf(numero
						.charAt(i))) * pesosAux[i]);

				for (int j = 0; j < aux.length(); j++) {
					soma = soma
							+ Integer.parseInt(String.valueOf(aux.charAt(j)));
				}
			}
		}

		final int resultado = 10 - soma % 10;

		if (resultado == 10) {
			return DIGITO_0;
		}

		return String.valueOf(resultado);
	}

}
